package com.xy.iot.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.time.LocalDateTime;
import java.util.List;

/**
 * fastjson工具类
 * @version:1.0.0
 */
public class FastJsonUtil {

    public static final SerializeConfig config = SerializeConfig.getGlobalInstance();
    static
        {
            // 使用和json-lib兼容的日期输出格式
            config.put(java.util.Date.class, new JSONLibDataFormatSerializer());
            // 使用和json-lib兼容的日期输出格式
            config.put(java.sql.Date.class, new JSONLibDataFormatSerializer());
            // 格式化LocalDateTime日期类型,自定义格式转换
            config.put(LocalDateTime.class,  new JSONLibDataFormatSerializer());
            // Long类型转化为String，解决丢失精度问题
            config.put(Long.class, ToStringSerializer.instance);
            config.put(Long.TYPE, ToStringSerializer.instance);
            // 格式化LocalDateTime日期类型,自定义格式转换
            config.put(LocalDateTime.class,  new JSONLibDataFormatSerializer());
        }
    ;

    public static final SerializerFeature[] features = {
            SerializerFeature.WriteMapNullValue, // 输出空置字段
            SerializerFeature.WriteNullListAsEmpty, // list字段如果为null，输出为[]，而不是null
            SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null，输出为0，而不是null
            SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null，输出为false，而不是null
            SerializerFeature.WriteNullStringAsEmpty, // 字符类型字段如果为null，输出为""，而不是null
            SerializerFeature.PrettyFormat,// 是Fastjson库中提供的一个序列化特性常量，用于控制JSON输出的格式化样式
            SerializerFeature.WriteBigDecimalAsPlain,// 解决BigDecimal精度丢失问题
            SerializerFeature.WriteDateUseDateFormat,// 日期格式化
            SerializerFeature.DisableCircularReferenceDetect// 防止循环引用
    };

    /**
     * 将对象转换成json字符串
     * @param object
     * @return
     */
    public static String toJSONStr(Object object) {
        return JSON.toJSONString(object, config, features);
    }
    /**
     * 将对象转换成json字节数组
     * @param object
     * @return
     */
    public static byte[] toJSONBytes(Object object) {
        return JSON.toJSONBytes(object, config, features);
    }

    /**
     * 将对象转换成json字符串，只用了序列化配置
     * @param object
     * @return
     */
    public static String toJSONNoSerializeConfigStr(Object object) {
        return JSON.toJSONString(object, config);
    }


    /**
     * 将json字符串转换成对象
     * @param text json字符串
     * @return
     */
    public static Object toBean(String text) {
        return JSON.parse(text);
    }

    /**
     * 将json字符串转换成对象
     * @param text json字符串
     * @param clazz 转换对象类型
     * @return
     * @param <T>
     */
    public static <T> T toBean(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    /**
     * 将json字符串转换成列表List
     * @param text json字符串
     * @param clazz 转换对象类型
     * @return
     * @param <T>
     */
    public static <T> List<T> toList(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz);
    }
    /**
     * 将Key  驼峰转成下划线 输出json格式
     * @param object
     * @return
     */
    public static String toUnderlineJsonString(Object object){
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(new com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy());
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        String reqJson = null;
        try {
            reqJson = mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return reqJson;
    }
}
